package comment_api

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"giv-vue-blog/global"
	"giv-vue-blog/models"
	"giv-vue-blog/models/res"
	"giv-vue-blog/service/redis_ser"
	"giv-vue-blog/utils"
	"gorm.io/gorm"
)

/*
CommentDel

	删除根评论
		统计根评论下的子评论数+1
		然后文章减去对应的评论数
		删掉评论
	删除子评论
		统计子评论下的评论数+1
		然后文章减去对应的评论数
		给父评论减去对应的评论数
		删掉评论
*/
// CommentDel 删除评论
// @Summary 删除评论
// @Tags 评论管理
// @Accept json
// @Produce json
// @Param id path int true "评论ID"
// @Success 200 {string} json "{"code": 0, "message": "删除评论成功"}"
// @Failure 400 {string} json "{"code": 1, "message": "参数错误"}"
// @Failure 401 {string} json "{"code": 2, "message": "未授权访问"}"
// @Failure 404 {string} json "{"code": 3, "message": "评论不存在"}"
// @Failure 500 {string} json "{"code": 4, "message": "服务器内部错误"}"
// @Router /api/comments/{id} [delete]
func (CommentApi) CommentDel(c *gin.Context) {
	var cr CommentIDRequest
	err := c.ShouldBindUri(&cr)
	if err != nil {
		res.FailedWithCode(res.ArgumentError, c)
		return
	}
	var commentModel models.CommentModel
	err = global.DB.Take(&commentModel, cr.ID).Error
	if err != nil {
		res.FailedWithMsg("评论不存在", c)
		return
	}
	//统计评论下的子评论数  +1
	subCommentList := FindSubCommentCount(commentModel)
	count := len(subCommentList) + 1
	redis_ser.NewComment().SetCount(commentModel.ArticleID, -count)

	//判断是否是子评论
	if commentModel.ParentCommentID != nil {
		//子评论
		//找父评论，减去对应的评论数
		global.DB.Model(&models.CommentModel{}).Where("id=?", *commentModel.ParentCommentID).
			Update("comment_count", gorm.Expr("comment_count - ?", count))
	}
	//删除子评论及当前评论
	var delCommentListID []uint
	for _, model := range subCommentList {
		delCommentListID = append(delCommentListID, model.ID)
	}
	//反转列表 倒着删除
	utils.Reverse(delCommentListID)
	delCommentListID = append(delCommentListID, commentModel.ID)
	for _, id := range delCommentListID {
		global.DB.Model(models.CommentModel{}).Delete("id = ?", id)
	}
	res.OkWithMsg(fmt.Sprintf("共删除 %d 条评论", len(delCommentListID)), c)
}
